

<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=&#34;auto&#34;>



<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/blog/img/favicon.png">
  <link rel="icon" href="/blog/img/favicon.jpg">
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="description" content="">
  <meta name="author" content="John Doe">
  <meta name="keywords" content="">
  
  <title>MySQL笔记 - ITaylorfan的小站</title>

  <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" />


  <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/github-markdown-css@4.0.0/github-markdown.min.css" />
  <link  rel="stylesheet" href="/blog/lib/hint/hint.min.css" />

  
    
    
      
      <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/highlight.js@10.7.2/styles/github-gist.min.css" />
    
  

  
    <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css" />
  



<!-- 主题依赖的图标库，不要自行修改 -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_ba1fz6golrf.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_kmeydafke9r.css">


<link  rel="stylesheet" href="/blog/css/main.css" />

<!-- 自定义样式保持在最底部 -->


  <script id="fluid-configs">
    var Fluid = window.Fluid || {};
    var CONFIG = {"hostname":"itaylorfan.gitee.io","root":"/blog/","version":"1.8.11","typing":{"enable":true,"typeSpeed":70,"cursorChar":"❤","loop":false},"anchorjs":{"enable":true,"element":"h1,h2,h3,h4,h5,h6","placement":"right","visible":"hover","icon":""},"progressbar":{"enable":true,"height_px":3,"color":"#29d","options":{"showSpinner":false,"trickleSpeed":100}},"copy_btn":true,"image_zoom":{"enable":true,"img_url_replace":["",""]},"toc":{"enable":true,"headingSelector":"h1,h2,h3,h4,h5,h6","collapseDepth":0},"lazyload":{"enable":true,"loading_img":"/img/loading.gif","onlypost":false,"offset_factor":2},"web_analytics":{"enable":false,"baidu":null,"google":null,"gtag":null,"tencent":{"sid":null,"cid":null},"woyaola":null,"cnzz":null,"leancloud":{"app_id":null,"app_key":null,"server_url":null}},"search_path":"/local-search.xml"};
  </script>
  <script  src="/blog/js/utils.js" ></script>
  <script  src="/blog/js/color-schema.js" ></script>
<meta name="generator" content="Hexo 5.4.0"></head>


<body>
  <header style="height: 85vh;">
    <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand"
       href="/blog/">&nbsp;<strong>ITaylorfan</strong>&nbsp;</a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/">
                <i class="iconfont icon-home-fill"></i>
                首页
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/archives/">
                <i class="iconfont icon-archive-fill"></i>
                归档
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/categories/">
                <i class="iconfont icon-category-fill"></i>
                分类
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/tags/">
                <i class="iconfont icon-tags-fill"></i>
                标签
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/blog/about/">
                <i class="iconfont icon-user-fill"></i>
                关于
              </a>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" target="_self" data-toggle="modal" data-target="#modalSearch">&nbsp;<i
                class="iconfont icon-search"></i>&nbsp;</a>
          </li>
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" target="_self">&nbsp;<i
                class="iconfont icon-dark" id="color-toggle-icon"></i>&nbsp;</a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

    <div class="banner" id="banner" parallax=true
         style="background: url('/blog/img/TS8-10-9.jpg') no-repeat center center;
           background-size: cover;">
      <div class="full-bg-img">
        <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
          <div class="page-header text-center fade-in-up">
            <span class="h2" id="subtitle" title="MySQL笔记">
              
            </span>

            
              <div class="mt-3">
  
  
    <span class="post-meta">
      <i class="iconfont icon-date-fill" aria-hidden="true"></i>
      <time datetime="2021-11-16 08:35" pubdate>
        2021年11月16日 早上
      </time>
    </span>
  
</div>

<div class="mt-1">
  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-chart"></i>
      9.3k 字
    </span>
  

  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-clock-fill"></i>
      
      
      114
       分钟
    </span>
  

  
  
</div>

            
          </div>

          
            <div class="scroll-down-bar">
              <i class="iconfont icon-arrowdown"></i>
            </div>
          
        </div>
      </div>
    </div>
  </header>

  <main>
    
      

<div class="container-fluid nopadding-x">
  <div class="row nomargin-x">
    <div class="d-none d-lg-block col-lg-2"></div>
    <div class="col-lg-8 nopadding-x-md">
      <div class="container nopadding-x-md" id="board-ctn">
        <div class="py-5" id="board">
          <article class="post-content mx-auto">
            <!-- SEO header -->
            <h1 style="display: none">MySQL笔记</h1>
            
            <div class="markdown-body">
              <h2 id="MySql基础"><a href="#MySql基础" class="headerlink" title="MySql基础"></a>MySql基础</h2><p>MySql是一种数据库，现在的<code>MySql</code>数据库是把数据存储在服务器上面，它是一个网络型数据库，可以同时为多个人进行服务。</p>
<p>mysql轻便，跨平台，所以我们优先学习这一种数据</p>
<p>MySql是一种<strong>关系型</strong>的<strong>服务器</strong>数据库，它可以使用面向对象的思维去理解它，运用它</p>
<p>在学习MySql之前，一定要先了解数据库的概念</p>
<h3 id="数据库的概念"><a href="#数据库的概念" class="headerlink" title="数据库的概念"></a>数据库的概念</h3><p>数据库其实与我们日常生活当中所使用的<code>Excel</code>很像。在一个Excel文件中，它会有很多个工作表，如下图</p>
<p><img src="https://pic.imgdb.cn/item/6170b1162ab3f51d914dd12d.png" srcset="/blog/img/loading.gif" lazyload alt="image-20210117093221763"></p>
<p>一个<code>Excel</code>文件我们就可以把它看成是一个<strong>数据库</strong>，而里面的每个表我们就可以把它看成成是<strong>数据库里面的数据表</strong></p>
<img src="https://pic.imgdb.cn/item/6170b1212ab3f51d914dd712.png" srcset="/blog/img/loading.gif" lazyload alt="image-20210117093539636" style="zoom:50%;" />

<p>数据库database的存储结构是库包含表datatable。同时我们再来看一下表</p>
<table>
<thead>
<tr>
<th>学生信息表</th>
<th>班级信息表</th>
</tr>
</thead>
<tbody><tr>
<td><img src="https://pic.imgdb.cn/item/6170b1e32ab3f51d914e3690.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211015160405664"></td>
<td><img src="https://pic.imgdb.cn/item/6170b1402ab3f51d914de4ea.png" srcset="/blog/img/loading.gif" lazyload alt="image-20210117093622242"></td>
</tr>
</tbody></table>
<p>在表里面，我们看到了有很多列的数据。数据库最基础的概念就是<strong>库包含表，表包含列，列里面放具体的信息</strong></p>
<p>数据库的操作是需要一个专门的技术去完成，它要使用特定的语句去操作这些数据，这些语句我们叫结构化查询语句<code>SQL(Structured Query Language)</code>。</p>
<p>SQL语句是操作数据库的专门语句，它分为三大类</p>
<ol>
<li><p><code>DDL</code>语句</p>
<p>全称叫数据库定义语句（<code>Database Define Language</code>），它用创建库，创建表，定义表的数据结构以及数据类型，不会操作数据库具体存放的数据。它主要的关键字有<code>create,drop,alter,modify,change,show,desc</code>等</p>
<p><strong>DDL语句只有结构有关，不与数据相关</strong></p>
</li>
<li><p><code>DML</code>语句</p>
<p>全称叫数据库操作语句（<code>Database Manipulation Language</code>），它不与数据库的结构有关，只负责操作数据库当中存放的数据，它主要的关键字有<code>insert,delete,update,select,where,and,or</code>等</p>
</li>
<li><p><code>DCL</code>语句</p>
<p>全称叫数据库控制语句（<code>Database control language</code>），它主要负责控制数据库的权限，一般情况下是DBA(DataBase Administrator 数据库管理员)使用这种语句</p>
</li>
</ol>
<pre><code class=" mermaid">graph TD
A[SQL语句类型]--&gt;B(DDL)
A--&gt;C(DML)
A--&gt;D(DCL)
</code></pre>

<hr>
<h3 id="数据库的连接"><a href="#数据库的连接" class="headerlink" title="数据库的连接"></a>数据库的连接</h3><p>在使用数据库之前，我们要先连接数据库，但是在初学阶段我们不建议同学们直接使用数据库管理工具来管理自己的数据库，而是要通过命令行来操作自己的数据库（也就是DDL语句）</p>
<p>在每个电脑上面我们都可以使用DOS命令来操作连接自己的数据库，所以我们只需有DOS（linux系统叫终端工具）就可以了</p>
<ol>
<li>按<code>win+r</code>键</li>
<li>输入<code>cmd</code>打开DOS窗口，如下所示</li>
</ol>
<img src="https://pic.imgdb.cn/item/6170b1632ab3f51d914df374.png" srcset="/blog/img/loading.gif" lazyload alt="image-20210117095559262" style="zoom:50%;" />

<p>我们在里面输入的命令全部都是<code>DOS</code>命令，现在我们先给大家介绍几个常用DOS命令</p>
<ol>
<li><code>dir</code>命令，列出当前目录下现的文件夹与文件</li>
<li><code>cd</code>命令，切换文件夹，<code>cd .</code>切换当前文件夹，<code>cd ..</code>切换到上级目录,<code>cd yangbiao</code>切换到yangbiao这个文件夹，<code>cd \</code>直接切换到当前这个盘符的根目录</li>
<li><code>ipconfig</code>查看当前的网络配置信息</li>
<li><code>netstat -ano</code>查看当前正在使用的所有端口号</li>
</ol>
<p>有了这个DOS命令以后，我们就可以开始使用DOS命令来连接我们的数据库</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ mysql -h 127.0.0.1 -uroot -p<br></code></pre></td></tr></table></figure>

<blockquote>
<p>-h代表的是host主机地址，也代表你要连接的mysql服务器地址，后面的127.0.0.1是本机IP,如果要连接其它的服务器，把这个IP换成其它服务器的IP，如果连接是自己的服务器，则可以把<code>-h 127.0.0.1</code>省略</p>
<p>-u代表user用户名，后面的root代表我们使用这个用户名<code>root</code>是mysql数据库当中的超级管理员</p>
<p>-p代表password，它的后面跟密码</p>
</blockquote>
<p><img src="https://pic.imgdb.cn/item/6170b17a2ab3f51d914dfe78.png" srcset="/blog/img/loading.gif" lazyload alt="image-20210117103951802"></p>
<p>当进入到这个界面的时候，我们就已经连接到数据库了，上面有个命令<code>Commands end with ; or \g.</code>代表<code>mysql</code>的命令以<code>;</code>结束，所以我们输入每一个sql句以后都要添加分号；<code>Your MySQL connection id is 21</code>你当前连接的编号是<code>21</code></p>
<p>一旦连接到数据库以后，我们接下来所输入应该是<code>SQL</code>语句了</p>
<h3 id="基础DDL语句"><a href="#基础DDL语句" class="headerlink" title="基础DDL语句"></a>基础DDL语句</h3><ol>
<li><p>退出mysql</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs javascript">exit;<br>-- 或<br>quit;<br></code></pre></td></tr></table></figure>
</li>
<li><p>显示当前所有数据库</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">show databases;<br></code></pre></td></tr></table></figure>
</li>
<li><p>创建数据库</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">create database test2;        -- 创建数据库<br>create database 数据库名;<br></code></pre></td></tr></table></figure>
</li>
<li><p>删除数据库</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">drop database test2;        -- 删除数据库<br>drop database 数据库名;<br></code></pre></td></tr></table></figure>
</li>
<li><p>切换正在使用的数据库</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">use test2;        <br>use 数据库名;<br></code></pre></td></tr></table></figure>
</li>
<li><p>显示数据库下面的所有的表</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">show tables;<br></code></pre></td></tr></table></figure>
</li>
<li><p>创建数据表</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs mysql">create table if not exists teacher_info(<br>    t_name varchar(10),<br>    t_sex varchar(2),<br>    t_age int,<br>    t_address varchar(50)<br>)engine=innodb default charset = UTF8;<br></code></pre></td></tr></table></figure>

<blockquote>
<p><code>engine=innodb</code>代表当前数据表的存储引擎使用的是<code>innodb</code>，这种存储引擎可以实现表与表之间的主外键关系</p>
</blockquote>
</li>
<li><p>删除数据表</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">drop table teacher_info;<br></code></pre></td></tr></table></figure>
</li>
<li><p>重命名表名</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">alter table teacher_info rename stu_info;    -- 将teacher_info重命名为stu_info<br>alter table 原表名 rename 新表名;<br></code></pre></td></tr></table></figure>
</li>
<li><p>显示数据表列的信息</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs mysql">show columns from stu_info;  -- 显示stu_info里面的列的信息<br>show columns from 表名;<br><br>-- 它有一简洁的命令<br>desc stu_info;<br>desc 表名;<br></code></pre></td></tr></table></figure>

<p><img src="https://pic.imgdb.cn/item/6170b25a2ab3f51d914e7de3.png" srcset="/blog/img/loading.gif" lazyload alt="image-20210117120009920"></p>
<p>上图就是显示的结果，<code>Field</code>代表列名，<code>Type</code>代表这名的数据类型，<code>Null</code>代表这列是否可以为空值，<code>Default</code>代表这一个如果在不输入的时候的默认值，<code>Extra</code>代表是否有外键或约束，索引等情况。<code>Key</code>代表这一列是否是主键</p>
</li>
<li><p>修改数据表，删除数据列</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">alter table stu_info drop column s_address;<br>alter table 表名 drop column 列名;<br></code></pre></td></tr></table></figure>
</li>
<li><p>修改列的名称</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">alter table stu_info change column s_name stu_name varchar(10);<br>alter table 表名 change column 原列名 新列名 描述信息;<br></code></pre></td></tr></table></figure>
</li>
<li><p>修改列的<strong>属性</strong>信息【修改描述信息】</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">alter table stu_info modify s_name varchar(30);<br>alter table 表名 modify 列名 列描述信息;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>修改列的名称我们使用<code>change</code>，修改列的属性我们使用<code>modify</code></p>
</blockquote>
</li>
<li><p>设置表的列不为空与默认信息</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs mysql">create table if not exists stu_info (<br>	sid int(11) not null,<br>	sname varchar(255) not null,<br>	ssex varchar(2) not null default &quot;男&quot;,<br>	stel varchar(20) <br>)engine  = innodb default charset = utf8;<br></code></pre></td></tr></table></figure>
</li>
<li><p>修改第15项当中的<code>s_address</code>不为空，设置默认值为20</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">alter table stu_info modify s_address varchar(50) not null default 20;<br></code></pre></td></tr></table></figure>
</li>
<li><p>添加唯一约束</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs mysql">create table if not exists stu_info (<br>	sid int(11) unique,<br>	sname varchar(20) not null,<br>	ssex varchar(2) not null default &quot;男&quot;,<br>	stel varchar(20)<br>)ENGINE = INNODB DEFAULT CHARSET = utf8;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>在使用唯一约束的时候，我们要在某一列的后面添加<code>unique</code>的描述信息</p>
</blockquote>
</li>
<li><p>在数据表当中设置主键</p>
<p><strong>什么是数据表的主键</strong>？</p>
<p>主键是数据表当中最重要的一个必不可少的一个关键技术，在数据表当中，如果某一列设置成了主键列，则这一列不能空，并且不能重复。主键叫<code>primary key</code></p>
<p>在日常生活当中，我们有一些信息都是主键信息。如学生的学号<strong>不能重复（唯一），也不能为空</strong>；每个人的身份证号不能重复，也不能为空，这种信息我们都会使用主键去表示</p>
<p>设置主键的方式有很多种</p>
<ul>
<li><p>如果一个表已经存在了，现在需要把某一列设置为主键</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">alter table stu_info add primary key(id);<br>alter table 表名 add primary key(列名);<br></code></pre></td></tr></table></figure>
</li>
<li><p>怎么样直接在创建表的时候就把某一列设置为主键</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs mysql">CREATE TABLE IF NOT EXISTS stu_info (<br>	sid int(11) primary key,<br>	sname varchar(255) not null,<br>	ssex varchar(2) not null default &quot;男&quot;,<br>	stel varchar(255)<br>)ENGINE = INNODB DEFAULT CHARSET  =  UTF8;<br><br>-- 或直接添加在最后<br>CREATE TABLE IF NOT EXISTS stu_info (<br>	sid int(11),<br>	sname varchar(255) not null,<br>	ssex varchar(2) not null default &quot;男&quot;,<br>	stel varchar(255),<br>	primary key(sid)<br>)ENGINE = INNODB DEFAULT CHARSET = UTF8;<br></code></pre></td></tr></table></figure>
</li>
</ul>
</li>
<li><p>删除主键</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">alter table stu_info drop primary key;<br>alter table 表名 drop primary key;<br></code></pre></td></tr></table></figure>
</li>
<li><p>配置自动增长列</p>
<p>在数据表里面，有些时候我们需要将某一列的数值自增，这个时候我们就可以配置自动增长列</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs mysql">CREATE TABLE IF NOT EXISTS stu_info (<br>	sid int(11) primary key auto_increment,<br>	sname varchar(255) not null,<br>	ssex varchar(2) not null default &quot;男&quot;,<br>	stel varchar(255)<br>)ENGINE = INNODB DEFAULT CHARSET = UTF8;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>在自增列里面，我们使用了<code>auto_increment</code>这个来完成，主键自增的列必须是一个整数的列，所以它必须是int类型或long类型</p>
</blockquote>
</li>
</ol>
<h3 id="mysql中文乱码处理"><a href="#mysql中文乱码处理" class="headerlink" title="mysql中文乱码处理"></a>mysql中文乱码处理</h3><p>在使用终端命令的时候，我们经常会发现中文乱码的情况。这个原因是因为当前操作系统与服务器数据库的中文编码格式不致所导致的</p>
<p>解决这个问题的方法很多</p>
<ol>
<li><p>查询服务器所设置的编码</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">show variables  like &#x27;%char%&#x27;;<br></code></pre></td></tr></table></figure>

<p><img src="https://pic.imgdb.cn/item/6170b3362ab3f51d914ef85e.png" srcset="/blog/img/loading.gif" lazyload alt="image-20210117152130953"></p>
</li>
<li><p>根据查询信息来设置相关的编码</p>
<p>在上面的查询结果里面，我们主要注意这几个项</p>
<p><code>character_set_client:utf8</code>这个设置代表客户的要求必须是utf8</p>
<p><img src="https://pic.imgdb.cn/item/6170b3662ab3f51d914f1b47.png" srcset="/blog/img/loading.gif" lazyload alt="image-20210117152326940"></p>
<p>当我们去查询我们的终端<code>cmd</code>工具，我们发现我们的编码是<code>GBK</code>不一致</p>
<p>我们要解决这个问题， 我们要么把客户的工具变在utf8,要把么把服务器的<code>character_set_client</code>设置为<code>gbk</code></p>
<p>我们现在在控制台里面输入<code>chcp 65001</code>，这个时候终端的格式就变成了<code>utf8</code>,然后当我们再次去查询数据库的时候，就不会乱码了</p>
<p><img src="https://pic.imgdb.cn/item/6170b3982ab3f51d914f3718.png" srcset="/blog/img/loading.gif" lazyload alt="image-20210117152946401"></p>
<p><strong>但是，它只是查询的时候不会乱码，不能插入数据</strong>，这一种方法现在一般很少使用了</p>
<p>我们反向的设置服务器是可以的</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">set character_set_client = gbk;<br></code></pre></td></tr></table></figure>

<p>但是查询仍然不行，还是报乱码，我们要继续设置链接的编码</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">set character_set_connection = gbk;<br></code></pre></td></tr></table></figure>

<p>这个时候还是乱码，因为我们还要设置查询结果的编码</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">set character_set_results = gbk;<br></code></pre></td></tr></table></figure>

<p>这样设置起来很麻烦，同时，断开服务器以后，又恢复成默认值了。所以后期<code>mysql</code>专门推出一个设置字符集改变的命令</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">set names gbk;<br>set names utf8;<br>set names 编码;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>后期一定要根据具体的要求去设置编码</p>
</blockquote>
</li>
</ol>
<h3 id="数据库的还原与备份"><a href="#数据库的还原与备份" class="headerlink" title="数据库的还原与备份"></a>数据库的还原与备份</h3><p>如果我们需要将一个数据库备份或数据库还原应该怎么办呢</p>
<h4 id="数据库还原"><a href="#数据库还原" class="headerlink" title="数据库还原"></a>数据库还原</h4><p>数据的还原其实就是将一个SQL脚本导入到数据库，然后去执行就可以了</p>
<ol>
<li><p>先创建一个数据库</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">create database h2003;<br></code></pre></td></tr></table></figure>
</li>
<li><p>切换到刚刚创建的数据库</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">use h2003;<br></code></pre></td></tr></table></figure>
</li>
<li><p>导入数据库的备份脚本，假设我们的备份脚本在d盘，名子叫<code>h2103.sql</code></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">source D:\h2003.sql<br></code></pre></td></tr></table></figure>

</li>
</ol>
<hr>
<h3 id="mysql数据类型简述"><a href="#mysql数据类型简述" class="headerlink" title="mysql数据类型简述"></a>mysql数据类型简述</h3><ol>
<li><p>varchar与char的区别</p>
<p><img src="https://pic.imgdb.cn/item/6170b42e2ab3f51d914f8cb4.png" srcset="/blog/img/loading.gif" lazyload alt="image-20210117111336592"></p>
<p><img src="https://pic.imgdb.cn/item/6170b43e2ab3f51d914f95b1.png" srcset="/blog/img/loading.gif" lazyload alt="image-20210117111938089"></p>
<p><code>char</code>的优点是存储与读取都非常快，它是对齐的存储格式，但是很消耗存储空间</p>
<p><code>varchar</code>的优点是长度不固定，根据你的内容来决定长度，它不用占用很大的空间，但是因为在存储的时候内存没有对齐 ，所以查找与存储的时候速度稍微慢一点</p>
<p>这两种数据类型在后期都会用到</p>
</li>
</ol>
<h2 id="MySql的DML语句"><a href="#MySql的DML语句" class="headerlink" title="MySql的DML语句"></a>MySql的DML语句</h2><p>之前在进入到MySql的时候，我们就提到过,MySql需要使用专门的语句SQL语句来进行操作，SQL语句的分类又分为三大类</p>
<ol>
<li>DDL语句，主要是用于控制数据库与数据表的结构 ，使用<code>create,drop,alter,show</code>等关键字，它不与数据库的内容相关</li>
<li>DML语句，主要是用于对数据表的内容进行增删改查，使用<code>insert,delete,update,select</code>等关键字，这种类型的SQL语句只操作数据库的内容，不对数据库及数据表的结构进行操作</li>
<li>DCL语句，主要是用数据库的权限进行操作</li>
</ol>
<p>我们已经了解了数据库表的创建及表的特点，现在我们需要去习怎么向操作表里面的数据，这个时候就需要学习DML这一个类型的语句（程序员的重点）</p>
<p>DML语句的学习主要是围绕“新增”，“删除”，“修改”，“查询”四个操作来完成，它分别会有一些特殊的关键字</p>
<table>
<thead>
<tr>
<th>操作</th>
<th>关键字</th>
</tr>
</thead>
<tbody><tr>
<td>新增</td>
<td><code>insert</code></td>
</tr>
<tr>
<td>修改</td>
<td><code>update</code></td>
</tr>
<tr>
<td>删除</td>
<td><code>delete</code></td>
</tr>
<tr>
<td>查询</td>
<td><code>select</code></td>
</tr>
</tbody></table>
<hr>
<h3 id="新增SQL语句"><a href="#新增SQL语句" class="headerlink" title="新增SQL语句"></a>新增SQL语句</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">insert 表名 (列名1,列名2....) values (值1,值2);<br></code></pre></td></tr></table></figure>

<p>上面就是新增的SQL语句</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">insert stu_info (sname,ssex,stel) values (<span class="hljs-string">&quot;杨标&quot;</span>,<span class="hljs-string">&quot;男&quot;</span>,<span class="hljs-string">&quot;18736271134&quot;</span>);<br></code></pre></td></tr></table></figure>

<h3 id="修改的SQL语句"><a href="#修改的SQL语句" class="headerlink" title="修改的SQL语句"></a>修改的SQL语句</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">update 表名 set 列名1 = 值1,列名2=值2... where 条件;<br></code></pre></td></tr></table></figure>

<p>上面就是修改的SQL语句，在修改的时候，我们如果要修改某些列，只需要单独的列出要修改的列就行了，不要修改的就不要列举，后面的where则代表限定条件</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">update stu_info set age = 20 where sname = &#x27;杨标&#x27;;<br>update stu_info set sage = sage + 20 where sname = &quot;杨标&quot;;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>注意，修改的SQL语句一定要添加限定的where条件，如果不添加限定的条件，这个时候会把所有的数据都给修改掉，这很危险</p>
</blockquote>
<p>修改语名里还可以同时修改多个列</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">update stu_info set sname = &quot;杨标00&quot; , ssex = &quot;男生&quot; where sid = 84;<br></code></pre></td></tr></table></figure>

<h3 id="删除SQL语句"><a href="#删除SQL语句" class="headerlink" title="删除SQL语句"></a>删除SQL语句</h3><p>删除是一个危险的操作，它使用<code>delete</code>的关键字来进行</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">delete from 表名 where 条件;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>在删除的时候如果不添加限定条件，则会把整个表的数据清空</p>
</blockquote>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-keyword">delete</span> <span class="hljs-keyword">from</span> stu_info where sid = <span class="hljs-number">87</span>;<br></code></pre></td></tr></table></figure>

<hr>
<p>上面的三种SQL语句都是属性新增 ，修改，删除的操作，比较简单 ，在DML语句里面，最复杂还是查询</p>
<h3 id="查询SQL语句"><a href="#查询SQL语句" class="headerlink" title="查询SQL语句"></a>查询SQL语句</h3><p>查询语句是一个比较复杂的一个语句，但本身基础语法又非常简单，只需要按要求进行就可以了</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select 列名1,列名2...from 表名 where 条件;<br></code></pre></td></tr></table></figure>

<p>这个<code>select</code>关键字后面跟的列名就是要显示出来的列的名称</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select sid,sname from stuinfo;<br></code></pre></td></tr></table></figure>

<p>如果希望显示所有的列的名称，则可以使用<code>*</code>来表示 </p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo;<br></code></pre></td></tr></table></figure>

<ol>
<li><p>查询性别为“男”的学生信息</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where ssex = &#x27;男&#x27;;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询cid小于4的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where cid &lt;= 4;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询cid不等于2的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where cid !=2;<br>-- 还可以<br>select * from stuinfo where cid &lt;&gt; 2;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询所有<code>sphoto</code>不为<code>null</code>的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sphoto is not null;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询所有<code>sphoto</code>为<code>null</code>的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sphoto is null;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询 cid在1~3之间的，包含1和3</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where cid &gt;= 1 and cid &lt;=3;<br></code></pre></td></tr></table></figure>

<p>如果多个限定条件要同时成立，我们可以使用<code>and</code>的关键字</p>
<p><strong>小技巧</strong>：如果是数字的区间表示，我们还可以使用另一个关键字<code>between and</code></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where cid between 1 and 3;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询性别为女，且cid为3的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where ssex = &#x27;女&#x27; and cid = 3;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询cid为1或cid为4的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where cid = 1 or cid = 4;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>上面的or就是或的条件使用</p>
</blockquote>
</li>
<li><p>查询cid为1或cid为4的且是女生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where (cid = 1 or cid = 4) and ssex = &#x27;女&#x27;;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询stuinfo表里面一共有多少条数据</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select count(*) from stuinfo;<br></code></pre></td></tr></table></figure>
</li>
<li><p><code>as</code>别名转换，可以将一个列或一个表或一个查询结果使用别名来表示</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select count(*) as &#x27;totalCount&#x27; from stuinfo<br></code></pre></td></tr></table></figure>
</li>
<li><p>当<code>as</code>去做别名转换的时候是可以省略掉的，所以上面的SQL语句可以转换为下面的写法</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select count(*) &#x27;totalCount&#x27; from stuinfo;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>上面的10~12是对count及as的使用讲解练习</p>
</blockquote>
</li>
<li><p>查询stuinfo表里面，男生与女生各有多少条【一条SQL语句完成】</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select ssex,count(*) &#x27;totalCount&#x27; from stuinfo <br>group by ssex;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询各民族各有多少人【分组聚合】</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select snation,count(*) from stuinfo<br>group by snation;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询每个班的男生女生各有多少</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select cid,ssex,count(*) from stuinfo<br>group by cid,ssex;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询汉族里面男生与女生各有多少</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select ssex,count(*) from stuinfo<br>where snation = &quot;汉族&quot;<br>group by ssex<br></code></pre></td></tr></table></figure>

<blockquote>
<p> 分组聚合其实就是group by 的使用</p>
<p> gropu by语句要放在where 语句的后面</p>
</blockquote>
</li>
<li><p>查询姓名为余珊珊,王静,李明的信息</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sname = &#x27;余珊珊&#x27; or sname = &#x27;王静&#x27; or sname = &#x27;李明&#x27;;<br></code></pre></td></tr></table></figure>

<p>上面的SQL语句虽然说是可以得到的结果的 ，但是我们发现这么写有一个问题</p>
<ul>
<li>如果限定的人越来越多，这个or的条件也越来越长</li>
</ul>
<p>我们还发现一个点， 就是这个or其实只是针对了一个字段<code>sname</code></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sname in (&#x27;余珊珊&#x27;,&#x27;王静&#x27;,&#x27;李明&#x27;);<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询姓名不为余珊珊,且不为王静,且不为李明的信息</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sname != &#x27;余珊珊&#x27; and sname !=&#x27;王静&#x27; and sname !=&#x27;李明&#x27;;<br></code></pre></td></tr></table></figure>

<p>对于这种情况我们也可以使用另一种写法</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sname not in (&#x27;余珊珊&#x27;,&#x27;王静&#x27;,&#x27;李明&#x27;);<br></code></pre></td></tr></table></figure>

<blockquote>
<p>上面的两个语句就是in与not in的使用场景</p>
</blockquote>
</li>
</ol>
<p>上面的18条语句都是精确查询语句，使用<code>=</code>或<code>!=</code>或<code>in</code>或<code>not in</code>及大于小于等，现在我们来了解一下模糊查询</p>
<h3 id="模糊查询"><a href="#模糊查询" class="headerlink" title="模糊查询"></a>模糊查询</h3><p>模糊查询分为以下几个点</p>
<ul>
<li><p>通配符查询<code>%</code></p>
</li>
<li><p>占位符查询<code>_</code></p>
</li>
</ul>
<p>模糊查询必须使用<code>like</code>关键字来连接我们的查询条件</p>
<ol start="19">
<li><p>查询姓名以苏开头的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo WHERE sname like &#x27;苏%&#x27;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询所有生日是15号的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sbirthday like &#x27;%15&#x27;;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询所有sname包含”小”的学生信息</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sname like &#x27;%小%&#x27;;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询姓“王”的学生，名子只有1个字的</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sname like &#x27;王_&#x27;;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询班级里面所有姓名是3个字的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sname like &#x27;___&#x27;;<br></code></pre></td></tr></table></figure>

</li>
</ol>
<h3 id="多表联查"><a href="#多表联查" class="headerlink" title="多表联查"></a>多表联查</h3><p>多表联查就是多表联合查询 。有存储数据的时候，有些时候我们的数据可能并不在一张表里面存储，如下所示</p>
<p><img src="https://pic.imgdb.cn/item/6170b4bf2ab3f51d914fe549.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211018163847431"></p>
<p>上面的一个表就是一个学生信息表，里面有一个字段叫cid,这是一个班级编号的字段，班级编号cid里面的数值1，2，3到底代表什么，我们不知道，我们要从另一张表<code>classinfo</code>里面来获取数据</p>
<p><img src="https://pic.imgdb.cn/item/6170b4dd2ab3f51d914ff5d2.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211018164021205"></p>
<p>在上图中就是一个班级信息表，我们可以看到所对应的cid是什么意思</p>
<p>这个时候就产生了一个现象，如果我查询学生信息的时候，我想知道这个学生的相关的班级信息怎么办呢？，这个时候就需要使用到多表联合查询技术</p>
<ol start="24">
<li><p>查询学生信息并显示所对应的班级名称</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select stuinfo.*,classinfo.cname from stuinfo,classinfo<br>where stuinfo.cid = classinfo.cid;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询学生信息，并显示所对应的班级名称，但要求班级是H1904的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select stuinfo.*,classinfo.cname from stuinfo,classinfo<br>where stuinfo.cid = classinfo.cid<br>and classinfo.cname = &#x27;H1904&#x27;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询学生信息，并显示所对应的班级名称，但要求classnumber是2941的，并且性别是女的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select stuinfo.*,classinfo.cname from stuinfo,classinfo<br>where stuinfo.cid = classinfo.cid<br>and classinfo.classnumebr = 2941<br>and stuinfo.ssex = &#x27;女&#x27;<br></code></pre></td></tr></table></figure>

</li>
</ol>
<p>在上面的SQL语句里面，我们可以看到SQL语句的多表联查其实是有语法规律的</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select 列名1,列名2... from 列名1,表名2...<br>where 表与表之间关联<br></code></pre></td></tr></table></figure>

<ol start="27">
<li><p>查询班级信息，并追加列显示这个班级的实际学生人数</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select <br>classinfo.*,<br>(select count(*) from stuinfo where stuinfo.cid = classinfo.cid)  &#x27;real_count&#x27;<br>from classinfo;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>上面的SQL语句其实执行效率是非常低的</p>
</blockquote>
</li>
</ol>
<p>整体上来讲多表联合查询其实是很方便的，但是我们工作当成如无必要都不会这么去写，我们会使用新推出的SQL主写法</p>
<h3 id="内联查询"><a href="#内联查询" class="headerlink" title="内联查询"></a>内联查询</h3><p>内联查询其实就是多表联查的另一种写法，这种写法很直观 ，很方便，并且很好理解，后期我们会使用这一种写法来替代上面多表联查的写法</p>
<p>它的语法如下</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select 列名 from 表1 <br>inner join 表2 on 表1.列 = 表2.列<br>inner join 表3 on xx.xx = xx.xx;<br></code></pre></td></tr></table></figure>

<p>你需要谁进来加入查询，你就通过<code>inner join</code>把它加入进来，然后再通过<code>on</code>设置它们的连接条件</p>
<ol start="28">
<li><p>查询学生信息并显示所对应的班级名称</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select a.*,b.cname from stuinfo a<br>inner join classinfo b on a.cid = b.cid;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询学生信息，并显示所对应的班级名称，但要求班级是H1904的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select a.*,b.cname from stuinfo a<br>inner join classinfo b on a.cid = b.cid<br>where b.cname = &#x27;H1904&#x27;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询学生信息，并显示所对应的班级名称，但要求classnumber是2941的，并且性别是女的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo a <br>inner join classinfo b on a.cid = b.cid<br>where b.classnumebr = 2941 <br>and a.ssex = &#x27;女&#x27;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询班级信息，并追加列显示这个班级的实际学生人数</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select b.*,a.real_count from<br>(select cid,count(*) &#x27;real_count&#x27; from stuinfo<br>group by cid) a<br>inner join classinfo b on a.cid = b.cid;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询所有学生的信息，追加显示班级名称及系别名称</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select t1.*,t2.cname,t3.dname from stuinfo t1<br>inner join classinfo t2 on t1.cid = t2.cid<br>inner join departmentinfo t3 on t2.did = t3.did<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询所有学生的信息，追加显示班级名称，系别名称及班主任姓名</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select t1.*,t2.cname,t3.dname,t4.instructorname from stuinfo t1<br>inner join classinfo t2 on t1.cid = t2.cid<br>inner join departmentinfo t3 on t2.did = t3.did<br>inner join instructor t4 on t2.instructorid = t4.instructorid <br></code></pre></td></tr></table></figure>
</li>
<li><p>查询成绩表里面最高分是多少</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select max(score) from gradeinfo;											<br></code></pre></td></tr></table></figure>

<blockquote>
<p>max函数是用于取最大值</p>
</blockquote>
</li>
<li><p>查询成绩表里面最低分是多少</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select min(score) from gradeinfo;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>min函数是用于取最小值</p>
</blockquote>
</li>
<li><p>求成绩表里面的平均分</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select avg(score) from gradeinfo;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>avg函数是用于取平均值</p>
</blockquote>
</li>
<li><p>查询每个学生的平均成绩【分组聚合】</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select sid,avg(score) &#x27;avg_score&#x27; from gradeinfo<br>group by sid;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询学生成绩表，显示每个学生的平均成绩，同时显示这个学生的姓名【分组聚合 +内联+子查询】</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select t2.sname,t1.* from <br>(select sid,avg(score) &#x27;avg_score&#x27; from gradeinfo<br>group by sid) t1<br>inner join stuinfo t2 on t1.sid = t2.sid<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询成绩最高分的学生的信息，显示学生的姓名</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from gradeinfo where score = (select max(score) from gradeinfo)<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询每个学生的平均成绩高于85分的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from <br>(select sid,avg(score) &#x27;avg_score&#x27; from gradeinfo<br>group by sid) t1<br>where t1.avg_score &gt; 85<br></code></pre></td></tr></table></figure>

<p>还有另一种写法</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select sid,avg(score) &#x27;avg_score&#x27; from gradeinfo<br>group by sid<br>having avg_score &gt; 85<br></code></pre></td></tr></table></figure>

<blockquote>
<p>如果我们希望在分组聚合以后再次执行条件过滤有两种方式</p>
<ul>
<li>使用子查询</li>
<li>使用<code>having</code>来过滤</li>
</ul>
</blockquote>
</li>
<li><p>在成绩信息表里面，求出每个学生的总成绩</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select sid,sum(score) &#x27;sum_score&#x27; from gradeinfo<br>group by sid<br></code></pre></td></tr></table></figure>
</li>
<li><p>在成绩信息表里，求出学生在期中考试与期末考试的总成绩</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select sid,eid,sum(score) &#x27;sum_score&#x27; from gradeinfo<br>group by sid,eid;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>SQL语句中的sum函数是用于求和</p>
</blockquote>
</li>
<li><p>查询老师里面年龄大于“孙鹏”老师的年龄的</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from <br>(select tage from teacherinfo where tname  = &#x27;孙鹏&#x27;) t1<br>inner join teacherinfo t2 on t2.tage &gt; t1.tage;<br><br>-- 或<br><br>select * from teacherinfo where tage &gt; (select tage from teacherinfo where tname  = &#x27;孙鹏&#x27;)<br></code></pre></td></tr></table></figure>

<blockquote>
<p>这个例子与上面的第39个例子是属于同一类型的例子，只是写法不一样了</p>
<p>这个例子主要是为了带出内联查询里面的<code>on</code>后面在进行链接的时候不一定非要是等号<code>=</code></p>
</blockquote>
</li>
<li><p>查询辅导员为程玉桃的所有学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select t1.* from stuinfo t1 <br>inner join classinfo t2 on t1.cid = t2.cid<br>inner join instructor t3 on t2.instructorid = t3.instructorid<br>where t3.instructorname = &quot;程玉桃&quot;;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询成绩信息表里面每一科成绩的最高分, 并且显示学生姓名，使用 <code>MAX()</code> 函数</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select t2.sname,t2.courseid,max(t2.score) &#x27;max_score&#x27; from<br>(select t1.*,t2.sname from gradeinfo t1<br>inner join stuinfo t2 on t1.sid = t2.sid) t2<br>group by t2.courseid<br></code></pre></td></tr></table></figure>

<blockquote>
<p>这条SQL语句也涉及到了子查询了，同时又涉及到了内联查询，再就是分组聚合和条件和显示的列并不相同</p>
</blockquote>
</li>
<li><p>查询老师里面年龄大于“孙鹏”老师的年龄的女老师</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from teacherinfo <br>where tsex = &quot;女&quot; and tage &gt; (select tage from teacherinfo where tname = &quot;孙鹏&quot;);<br><br>-- 或<br><br>select * from <br>(select tage from teacherinfo where tname = &quot;孙鹏&quot;) t1<br>inner join teacherinfo t2 on t2.tage &gt; t1.tage<br>where t2.tsex = &quot;女&quot;<br></code></pre></td></tr></table></figure>
</li>
<li><p>在学生信息表里面，对每个学生的平均成绩做一个评级（在平均成绩的后面追加一个列为评级列）</p>
<p>90分或以上为优秀，80<del>89为良好，70</del>79为中等，60~69为及格，否则为不及格</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select <br>t1.*,<br>(case <br>	when t1.avg_score&gt;=90 then &#x27;优秀&#x27;<br>	when t1.avg_score&gt;=80 then &#x27;良好&#x27;<br>	when t1.avg_score&gt;=70 then &#x27;中等&#x27;<br>	when t1.avg_score&gt;=60 then &#x27;及格&#x27;<br>	else &#x27;不及格&#x27;<br>end) &#x27;level&#x27;<br>from<br>(select sid,avg(score) &#x27;avg_score&#x27; from gradeinfo<br>group by sid) t1<br></code></pre></td></tr></table></figure>
</li>
<li><p>在老师信息表里面，加一个称呼，男老师显示小哥哥，女老师显示小姐姐</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select <br>*,<br>(case<br>		when tsex = &#x27;男&#x27; then &#x27;小哥哥&#x27;<br>		when tsex = &#x27;女&#x27; then &#x27;小姐姐&#x27;<br>		else &#x27;人妖&#x27;<br>end) &#x27;nickName&#x27;<br>from <br>teacherinfo;<br><br>-- 或<br><br>select *,if(tsex = &#x27;男&#x27;,&#x27;小哥哥&#x27;,&#x27;小姐姐&#x27;) &#x27;nickName&#x27; from teacherinfo;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>如果判断条件比较少，可以直接 使用<code>if</code>来完成</p>
</blockquote>
</li>
<li><p>字符串截取</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">select *,substr(tacion,<span class="hljs-number">1</span>,<span class="hljs-number">2</span>) <span class="hljs-string">&#x27;province&#x27;</span> <span class="hljs-keyword">from</span> teacherinfo<br></code></pre></td></tr></table></figure>

<blockquote>
<p>substr是用于截取字符串，<code>substr(columnName,start,length)</code>,它的位置是从1开始的</p>
</blockquote>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select *,right(tacion,2) &#x27;city&#x27; from teacherinfo;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>right是从右边开始截取,<code>right(columnName,length)</code></p>
</blockquote>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select *,left(tphone,4) from teacherinfo;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>left函数是从左边开始截取，<code>left(columnName,length)</code></p>
</blockquote>
</li>
<li><p>把所有少数民族（非汉族）的学生的第次考试成绩都+1</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">update gradeinfo set score = score + 1 where sid in (<br>	select sid from stuinfo where snation != &#x27;汉族&#x27;<br>);<br></code></pre></td></tr></table></figure>

<blockquote>
<p>在上面的SQL语句里面，我们看到我们把某一个查询的结果sid列表成了另一个SQL语句的where条件去使用，使用了<code>in</code>的关键字</p>
</blockquote>
</li>
<li><p>把班主任为“程玉桃”的所有学生分数+1</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs mysql">update gradeinfo set score = score + 1 where sid in (<br>select sid from stuinfo t1<br>inner join classinfo t2 on t1.cid = t2.cid<br>inner join instructor t3 on t2.did = t3.did<br>where t3.instructorname = &quot;程玉桃&quot;)<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询所有老师信息，年龄从小到大排列</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from teacherinfo<br>order by tage asc<br></code></pre></td></tr></table></figure>

<blockquote>
<p>order by 根据某一列去排列，默认是asc的从小到大，如果希望从大到小则使用desc</p>
</blockquote>
</li>
<li><p>去重某一列，如我们把成绩信息表中的sid去重</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select distinct sid from gradeinfo;<br></code></pre></td></tr></table></figure>

<blockquote>
<p>如果单独显示某一列，并且希望去除重复项，可以在这一项的前面添加distinct</p>
</blockquote>
</li>
<li><p>查询一下有谁没有参加期中考试</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sid not in (<br>	select distinct sid from gradeinfo where eid = &#x27;0801&#x27;<br>);<br></code></pre></td></tr></table></figure>
</li>
<li><p>数据库分页【重点】</p>
<p>在后期做项目的时候经常会使用使用到数据库分页，MySql的数据库分页非常简单，只需要使用一个关键字<code>limit</code>就可以了</p>
<p>它的语法格式是<code>limit offset,count</code>，offset代表跳过多少条，count代表取多少条</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs mysql">-- 查询学生信息表，每页只显示5条，怎么办？<br>-- select * from stuinfo limit 0,5		第一页<br>-- select * from stuinfo limit 5,5		第二页<br>-- select * from stuinfo limit 10,5		第三页<br>-- select * from stuinfo limit 15,5		第四页<br>select * from stuinfo limit 20,5		-- 第五页<br></code></pre></td></tr></table></figure>

<blockquote>
<p>后期做项目的时候会得到一个公式，<code>pageIndex</code>代表取第几页，<code>pageSize</code>代表每页显示多少条，则<code>limit</code>的公式应该是<code>select * from 表名 limit (pageIndex-1)*pageSize,pageSize;</code></p>
</blockquote>
</li>
<li><p>结果集并联</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs mysql">-- 查询一共有多少学生<br>-- 查询一共有多少老师<br>-- 查询一共有多少班级<br>select count(*) &#x27;totalCount&#x27; from stuinfo<br>union all<br>select count(*) &#x27;totalCount&#x27; from teacherinfo<br>union all<br>select count(*) &#x27;totalCount&#x27; from classinfo<br></code></pre></td></tr></table></figure>

<blockquote>
<p>当一个查询结果希望与另一个结果并联在一起显示的时候，我们可以使用union all来完成</p>
</blockquote>
<p>一般在显示结果集并联的时候，我们都会追加一列名称，如下所示</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select &#x27;stu_count&#x27;,count(*) &#x27;totalCount&#x27; from stuinfo<br>union all<br>select &#x27;teacher_count&#x27;,count(*) &#x27;totalCount&#x27; from teacherinfo<br>union all<br>select &#x27;class_count&#x27;, count(*) &#x27;totalCount&#x27; from classinfo<br></code></pre></td></tr></table></figure>

<p><img src="https://pic.imgdb.cn/item/6170b5792ab3f51d915049c9.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019105352027"></p>
<p>但是上面的显示结果并不好，我们要得到下面的结果</p>
<p><img src="https://pic.imgdb.cn/item/6170b5872ab3f51d915051dc.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019105446612"></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select  <br>	max(if(stu_count=&quot;stu_count&quot;,totalCount,0)) &#x27;stu_count&#x27;,<br>	max(if(stu_count=&quot;teacher_count&quot;,totalCount,0)) &#x27;teacher_count&#x27;,<br>	max(if(stu_count=&quot;class_count&quot;,totalCount,0)) &#x27;class_count&#x27;<br>from <br>(select &#x27;stu_count&#x27;,count(*) &#x27;totalCount&#x27; from stuinfo<br>union all<br>select &#x27;teacher_count&#x27;,count(*) &#x27;totalCount&#x27; from teacherinfo<br>union all<br>select &#x27;class_count&#x27;, count(*) &#x27;totalCount&#x27; from classinfo) t1<br></code></pre></td></tr></table></figure>


</li>
<li><p>行转列</p>
<p>将图1的结果转换成图2的结果</p>
<table>
<thead>
<tr>
<th>图1</th>
<th>图2</th>
</tr>
</thead>
<tbody><tr>
<td><img src="https://pic.imgdb.cn/item/6170b6de2ab3f51d9151125e.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019102109018"></td>
<td><img src="https://pic.imgdb.cn/item/6170b6f42ab3f51d915122bc.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019102116875"></td>
</tr>
</tbody></table>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select sid,<br>	max(case when subject = &quot;语文&quot; then score else 0 end) &quot;语文&quot;,<br>	max(case when subject = &quot;数学&quot; then score else 0 end) &quot;数学&quot;,<br>	max(case when subject = &quot;外语&quot; then score else 0 end) &quot;外语&quot;<br>from aaa<br>group by sid<br><br>-- 或使用if也可以完成<br>select sid ,<br>	max(if(subject=&quot;语文&quot;,score,0)) &quot;语文&quot;,<br>	max(if(subject=&quot;数学&quot;,score,0)) &quot;数学&quot;,<br>	max(if(subject=&quot;外语&quot;,score,0)) &quot;外语&quot;<br>from aaa<br>group by sid;<br></code></pre></td></tr></table></figure>

</li>
</ol>
<h3 id="DML正则查询【扩展】"><a href="#DML正则查询【扩展】" class="headerlink" title="DML正则查询【扩展】"></a>DML正则查询【扩展】</h3><p>在MySql里面也是支持正则表达式的，但是只支持基础的正则表达式，没有前瞻，没有后顾，也没有原子组编号</p>
<ol>
<li><p>找到以蔡开头的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sname regexp &#x27;^蔡&#x27;;<br>-- 以前的模糊查询方式<br>select * from stuinfo where sname like &#x27;蔡%&#x27;;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询以标结尾的学生</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sname regexp &#x27;标$&#x27;<br>-- 以前的模糊查询方式<br>select * from stuinfo where sname like &#x27;%标&#x27;;<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询学生信息表里里央，名子是3~4位的</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo where sname regexp &#x27;.&#123;3,4&#125;&#x27;;<br>-- 以前的模糊查询方式<br>select * from stuinfo where sname like &#x27;___&#x27; or sname like &#x27;____&#x27;;<br></code></pre></td></tr></table></figure>


</li>
</ol>
<hr>
<h3 id="多表联合查询详解"><a href="#多表联合查询详解" class="headerlink" title="多表联合查询详解"></a>多表联合查询详解</h3><p>以前在学习多表联的时候有两种方式，如下</p>
<ol>
<li><p>以前的写法</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select 列名1,列名2 from 表名1,表名2<br>where 表名1.列 = 表名2.列<br></code></pre></td></tr></table></figure>
</li>
<li><p>新的写法：内联查询</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select 列名1,列名2 from 表名1<br>inner join 表名2 on 表名1.列 = 表名2.列<br></code></pre></td></tr></table></figure>

<blockquote>
<p>这里的inner join我们叫内联查询</p>
</blockquote>
</li>
</ol>
<pre><code class=" mermaid">graph TD
A[联合查询]--&gt;B[左联查询]
A--&gt;C[内联查询]
A--&gt;D[右联查询]
</code></pre>

<p><img src="https://pic.imgdb.cn/item/6170b70c2ab3f51d91512d93.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019134936641"></p>
<p>现在我们有了上面的两张表，然后我们去执行内联查询</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stu1<br>inner join stu2 on stu1.sid = stu2.sid;<br></code></pre></td></tr></table></figure>

<p> <img src="https://pic.imgdb.cn/item/6170b7202ab3f51d9151370d.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019135618098"></p>
<p>我们发现经过内联查询以后，得到的结果只有2条数据，这是为什么呢？</p>
<p><img src="https://pic.imgdb.cn/item/6170b73f2ab3f51d91514dcb.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019140043957"></p>
<ul>
<li><code>left join</code>左联查询，结果以左边的表为主</li>
<li><code>inner join</code>内联查询，取两个表的交集部分</li>
<li><code>right join</code> 右联查询，结果以右边的表为主</li>
</ul>
<p><strong>left join查询</strong></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stu1<br>left join stu2 on stu1.sid = stu2.sid;<br></code></pre></td></tr></table></figure>

<p><img src="https://pic.imgdb.cn/item/6170b7b92ab3f51d91518fb8.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019140153017"></p>
<p><strong>right join查询</strong></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stu1<br>right join stu2 on stu1.sid = stu2.sid;<br></code></pre></td></tr></table></figure>

<p><img src="https://pic.imgdb.cn/item/6170b7e62ab3f51d9151a6d3.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019140315692"></p>
<h3 id="主键与外键"><a href="#主键与外键" class="headerlink" title="主键与外键"></a>主键与外键</h3><p>什么是主键？主键有两个特点</p>
<ol>
<li>不为空</li>
<li>不重复</li>
</ol>
<p>一个数据表里面如果有了主键以后就可以极大的提升操作效率</p>
<p>现在我们尝试给一个没有主键的表试一下</p>
<p><img src="https://pic.imgdb.cn/item/6170b7fb2ab3f51d9151b0ee.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019141122216"></p>
<p>现有上面的数据表，没有设置主键 ，现在我们希望删除第二行的杨标的数据，怎么办？</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">delete from bbb where sname = &quot;杨标&quot; and sage = 20<br></code></pre></td></tr></table></figure>

<p>这个时候我们可以看到，这样做非常麻烦 ，这个时候我们为了找到我们所需要的数据，我们的过滤条件已经写了2个，后期数据列比较多，我们会更麻烦</p>
<p><img src="https://pic.imgdb.cn/item/6170b8642ab3f51d9151ee27.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019141354162"></p>
<p>这个时候如果我们要删除第2条数据，SQL语句就又变了</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">delete from bbb where sname = &quot;杨标&quot; and sage = 20 and ssex = &quot;男&quot;;<br></code></pre></td></tr></table></figure>

<p>这个时候我们的过滤条件就又增加了，所以没有主键的表操作起来是非常麻烦的。现在我们将这个数据表添加一个自增的主键</p>
<p><img src="https://pic.imgdb.cn/item/6170b8642ab3f51d9151ee2d.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019141842464"></p>
<p>现在有了主键 id,如果我们现在要删除第2条数据，怎么办？</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">delete from bbb where id = 2;<br></code></pre></td></tr></table></figure>

<p>后面的数据无论怎么增加，我们过滤条件都不会变，因为主键不会为空，也不会重复</p>
<blockquote>
<p>小技巧：如果某些数据表实在是不知道给谁设置主键 ，我们就可以添加一个自增的ID列做为主键</p>
</blockquote>
<hr>
<p><strong>什么是外键？</strong></p>
<blockquote>
<p>当一个表的某一列引用了另一个表的主键存储，那么这个表的这一列我们就叫外键列</p>
</blockquote>
<p><img src="https://pic.imgdb.cn/item/6170b9792ab3f51d9152869e.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019142738626"></p>
<p>上面有一个班级信息表及学生信息表，根据我们的正常的业务逻辑，一个学生应该是属于一个班级的，而在右边的学生信息表里面，我们发现有几个数据是有问题，如H2109，C2001，J1001这几个班是不存在的，所以这是不合理</p>
<p>这个时候我们就应该换一种方式存储（MySql叫服务器的关系型数据库），表与表之间是可以构建关系的【这个关键主要就是主外键关系】</p>
<p><img src="https://pic.imgdb.cn/item/6170b9792ab3f51d915286a3.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019143147154"></p>
<p>在上面的图里面，我们把学生信息表里面的信息改了一下，最后的“所属班级”只能从班级信息表里面获取数据，并且存下来的是班级编号</p>
<p>这个时候我们就发现学生信息表里面的“所属班级”引用 了班级信息表里面的“班级编号”，这个时候我们就把所属班级称之为外键列</p>
<p>外键：引用了另一个表的主键存储</p>
<p><strong>classinfo班级表的创建DDL</strong></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs mysql">create table if not exists classinfo (<br>	cid int(11) primary key auto_increment,<br>	cname varchar(255) not null,<br>	caddress varchar(255) not null<br>)engine = innodb default charset = utf8;<br></code></pre></td></tr></table></figure>

<p><strong>stuinfo学生表的创建DDL</strong></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs mysql">create table if not exists stuinfo (<br>	sid int(11) primary key auto_increment,<br>	sname varchar(255) not null,<br>	ssex varchar(2) not null,<br>	sage int(11) not null,<br>	cid int(11) not null,<br>	foreign key(cid) references classinfo(cid)  -- 这一行才是最重要的，添加外键<br>)engine = innodb default charset = utf8;<br></code></pre></td></tr></table></figure>

<p>当一个表与另一个表形成了主外键的关系，我们就把这个关系称之为主外键约束关系</p>
<h3 id="主键与外键的约束事项"><a href="#主键与外键的约束事项" class="headerlink" title="主键与外键的约束事项"></a>主键与外键的约束事项</h3><p>当一个表与另一个表构成了主外键约束关系以后，两个表之间就不能随意操作数据了</p>
<p><img src="https://pic.imgdb.cn/item/6170b9d02ab3f51d9152c35b.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019152812890"></p>
<ol>
<li><p>当向外键列插入主键当中不存在的数据的时候，我们就会发现报错</p>
<p><img src="https://pic.imgdb.cn/item/6170b9e62ab3f51d9152ce7f.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019152709572"></p>
</li>
<li><p>如果我们在班级表里面去删除数据会有什么问题</p>
<p><img src="https://pic.imgdb.cn/item/6170ba222ab3f51d9152ed9c.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019152941637"></p>
<p>这个时候直接报错了</p>
</li>
<li><p>我们尝试去修改班级表的主键数据</p>
<p><img src="https://pic.imgdb.cn/item/6170ba4b2ab3f51d91530213.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019153028256"></p>
</li>
</ol>
<p>这就是主外键的约束关系</p>
<ul>
<li>外键列只能使用主键列的数据</li>
<li>主键列不能随意的删除与更新</li>
</ul>
<p>这一种主外键 的关系是由以下的东西决定的</p>
<p><img src="https://pic.imgdb.cn/item/6170baa92ab3f51d915335af.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019153207504"></p>
<p>默认情况下，删除与更新的时候都是<code>restrict</code>受限制的状态，在这个状态下面，是不允许更新与删除的</p>
<p><img src="https://pic.imgdb.cn/item/6170baa92ab3f51d915335b4.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019153320526"></p>
<p>当我们把上面的两个选项换成了<code>cascade</code>以后，这个时候的主外键操作就变成了层叠状态，当然们再进行主键的删除与更新操作的时候，外键也会受到影响<font color="red">这种现象非常危险，不建议这么设置</font></p>
<p><strong>注意事项</strong>：</p>
<ol>
<li>主外键的名称可以不相同，但是数据类型与数据长度必须保持相同</li>
<li>两个表形成主外键约束以后，应该是先在主键表里面添加数据，再到外键表里面添加数据</li>
<li>当两个表约成了主外键约束以后就不要随意的删除与更新主键表数据</li>
<li>在<code>navicat</code>工具里面，我们可以使用工具快速的创建主外键关系，外键列拖动到主键值（你的目标一定是一个主键）</li>
<li>如果原来的外键列有数据，可能会报错，报错的原因是因为外键里面有数据可能主键列里面还不存在</li>
</ol>
<h3 id="数据库视图"><a href="#数据库视图" class="headerlink" title="数据库视图"></a>数据库视图</h3><p>视图是一个虚拟的表，它本质上面是串SQL语句</p>
<p>至于视图的作用，我们先从下面的案例来了解</p>
<p><strong>场景</strong> ：查询学生信息，显示这个学生的所有信息，班级名称，辅导员名称</p>
<p>按照我们以前的情况，我们会使用多表联查的方式来进行，如下</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select t1.*,t2.cname,t3.instructorname,t4.dname from stuinfo t1<br>inner join classinfo t2 on t1.cid = t2.cid<br>inner join instructor t3 on t2.instructorid = t3.instructorid<br>inner join departmentinfo t4 on t2.did = t4.did<br></code></pre></td></tr></table></figure>

<p>结果如下</p>
<p><img src="https://pic.imgdb.cn/item/6170baeb2ab3f51d91535961.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019154942672"></p>
<p>我们以后如果每次查询都要得到一个像这样的结果或者在这个结果里面再次做二次查询的时候就很麻烦 </p>
<p>我们可以将上面的查询结果保存在一个虚拟的表（视图当中）</p>
<p><strong>创建视图的DDL语句</strong></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs mysql">create view stuinfo_view<br>as<br>(select t1.*,t2.cname,t3.instructorname,t4.dname from stuinfo t1<br>inner join classinfo t2 on t1.cid = t2.cid<br>inner join instructor t3 on t2.instructorid = t3.instructorid<br>inner join departmentinfo t4 on t2.did = t4.did)<br></code></pre></td></tr></table></figure>

<p>当上面的代码执行完毕以后，我们就可以看到下面的结果</p>
<p><img src="https://pic.imgdb.cn/item/6170bb002ab3f51d915365a5.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019155346327"></p>
<p>当视图创建成功以后，我们就可以像创建表一样的去创建视图了</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs mysql">select * from stuinfo_view where cname = &#x27;J1908&#x27;;<br></code></pre></td></tr></table></figure>

<p>视图还可以使用<code>navicat</code>工具来进行创建 ，如下所示</p>
<p><img src="https://pic.imgdb.cn/item/6170bb0e2ab3f51d915370dc.png" srcset="/blog/img/loading.gif" lazyload alt="image-20211019161244317"></p>

            </div>
            <hr>
            <div>
              <div class="post-metas mb-3">
                
                  <div class="post-meta mr-3">
                    <i class="iconfont icon-category"></i>
                    
                      <a class="hover-with-bg" href="/blog/categories/%E5%90%8E%E7%AB%AF%E7%AC%94%E8%AE%B0/">后端笔记</a>
                    
                  </div>
                
                
                  <div class="post-meta">
                    <i class="iconfont icon-tags"></i>
                    
                      <a class="hover-with-bg" href="/blog/tags/MySQL/">MySQL</a>
                    
                      <a class="hover-with-bg" href="/blog/tags/SQL/">SQL</a>
                    
                  </div>
                
              </div>
              
                <p class="note note-warning">
                  
                    本博客所有文章除特别声明外，均采用 <a target="_blank" href="https://creativecommons.org/licenses/by-sa/4.0/deed.zh" rel="nofollow noopener noopener">CC BY-SA 4.0 协议</a> ，转载请注明出处！
                  
                </p>
              
              
                <div class="post-prevnext">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/blog/2021/11/16/Node.js%E7%AC%94%E8%AE%B0/">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">Node.js笔记</span>
                        <span class="visible-mobile">上一篇</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/blog/2021/10/16/ES6%E7%AC%94%E8%AE%B0/">
                        <span class="hidden-mobile">ES6笔记</span>
                        <span class="visible-mobile">下一篇</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            
          </article>
        </div>
      </div>
    </div>
    
      <div class="d-none d-lg-block col-lg-2 toc-container" id="toc-ctn">
        <div id="toc">
  <p class="toc-header"><i class="iconfont icon-list"></i>&nbsp;目录</p>
  <div class="toc-body" id="toc-body"></div>
</div>

      </div>
    
  </div>
</div>

<!-- Custom -->


    

    
      <a id="scroll-top-button" href="#" role="button">
        <i class="iconfont icon-arrowup" aria-hidden="true"></i>
      </a>
    

    
      <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">搜索</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v"
                 for="local-search-input">关键词</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>
    

    
  </main>

  <footer class="text-center mt-5 py-3">
  <div class="footer-content">
     <a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>Fluid</span></a> 
  </div>
  

  

  
</footer>


  <!-- SCRIPTS -->
  
  <script  src="https://cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.js" ></script>
  <link  rel="stylesheet" href="https://cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.css" />

  <script>
    NProgress.configure({"showSpinner":false,"trickleSpeed":100})
    NProgress.start()
    window.addEventListener('load', function() {
      NProgress.done();
    })
  </script>


<script  src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" ></script>
<script  src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.min.js" ></script>
<script  src="/blog/js/events.js" ></script>
<script  src="/blog/js/plugins.js" ></script>

<!-- Plugins -->


  
    <script  src="/blog/js/img-lazyload.js" ></script>
  



  



  <script  src="https://cdn.jsdelivr.net/npm/tocbot@4.12.3/dist/tocbot.min.js" ></script>



  <script  src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js" ></script>



  <script  src="https://cdn.jsdelivr.net/npm/anchor-js@4.3.1/anchor.min.js" ></script>



  <script defer src="https://cdn.jsdelivr.net/npm/clipboard@2.0.8/dist/clipboard.min.js" ></script>



  <script  src="/blog/js/local-search.js" ></script>






  <script  src="https://cdn.jsdelivr.net/npm/typed.js@2.0.12/lib/typed.min.js" ></script>
  <script>
    (function (window, document) {
      var typing = Fluid.plugins.typing;
      var title = document.getElementById('subtitle').title;
      
      typing(title)
      
    })(window, document);
  </script>









  <script  src="https://cdn.jsdelivr.net/npm/mermaid@8.10.1/dist/mermaid.min.js" ></script>
  <script>
    if (window.mermaid) {
      mermaid.initialize({"theme":"default"});
    }
  </script>







<!-- 主题的启动项 保持在最底部 -->
<script  src="/blog/js/boot.js" ></script>


</body>
</html>
